package org.wisdom.ab.domain.staff.repository;

import org.springframework.data.domain.*;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.EntityGraph;
import org.springframework.lang.Nullable;
import org.wisdom.ab.domain.staff.entity.AbStaff;
import org.wisdom.ab.domain.staff.repository.dao.StaffDao;
import org.wisdom.data.jpa.repository.WisdomRepository;

/**
 * 成员仓储
 *
 * @author 张智研
 * @date 2022/05/16 08:44
 */
public interface StaffRepository extends WisdomRepository<AbStaff, String>, StaffDao {
    /**
     * 查询指定系统用户
     *
     * @author 张智研
     * @date 2022/05/20 08:48
     * @param staffCode
     *            用户编码
     * @return org.wisdom.ab.domain.entity.AbStaff
     */
    AbStaff findByStaffCode(String staffCode);

    /**
     * 重写方法，解决N+1问题
     *
     * @author 张智研
     * @date 2023/05/19 11:39
     * @param spec 查询条件
     * @param pageable 分页条件
     * @return org.springframework.data.domain.Page<org.wisdom.ab.domain.staff.entity.AbStaff>
     */
    @Override
    @EntityGraph(value = "staffWithDepartment", type = EntityGraph.EntityGraphType.FETCH)
    Page<AbStaff> findAll(@Nullable Specification<AbStaff> spec, Pageable pageable);

    /**
     * 查询成员列表
     *
     * @author 张智研
     * @date 2022/05/20 08:49
     * @param staff
     *            查询成员条件
     * @param page
     *            页码
     * @param size
     *            大小
     * @param sort
     *            排序
     * @return org.springframework.data.domain.Page<org.wisdom.ab.domain.entity.AbStaff>
     */
    default Page<AbStaff> findAll(AbStaff staff, int page, int size, Sort sort) {
        ExampleMatcher matcher =
            ExampleMatcher.matching().withMatcher("staffCode", ExampleMatcher.GenericPropertyMatcher::startsWith)
                .withMatcher("staffName", ExampleMatcher.GenericPropertyMatchers.contains());
        Example<AbStaff> userExample = Example.of(staff, matcher);
        return findAll(userExample, PageRequest.of(page, size, sort));
    }

    /**
     * 查询成员列表
     *
     * @author 张智研
     * @date 2022/05/20 08:49
     * @param staff
     *            系统用户
     * @param page
     *            页码
     * @param size
     *            条数
     * @return org.springframework.data.domain.Page<org.wisdom.ab.domain.entity.AbStaff>
     */
    default Page<AbStaff> findAll(AbStaff staff, int page, int size) {
        return findAll(staff, page, size, Sort.unsorted());
    }
}
